package com.sxj.corejava.code15_反射;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Test03_操作构造方法 {

    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        Class c = User.class;
        // 使用Class提供的方法
        // 1.返回public修饰的构造方法
        Constructor[] constructors = c.getConstructors();
        for(Constructor constructor : constructors){
            System.out.println(constructor);
        }

        System.out.println("******************************");
        // 2.获取当前类中所有构造方法,不区分修饰符
        constructors = c.getDeclaredConstructors();
        for(Constructor constructor : constructors){
            System.out.println(constructor);
        }

        System.out.println("******************************");
        // 3.根据传递的参数获取对应的public修饰的构造方法
        Constructor constructor = c.getConstructor();
        System.out.println("无参构造方法:"+constructor);
        constructor = c.getConstructor(Integer.class,String.class,String.class);
        System.out.println(constructor);
        // 如果没有找到对应构造方法,则报错
//        constructor = c.getConstructor(String.class);
//        System.out.println(constructor);

        System.out.println("******************************");
        // 4.根据传递的参数获取对应的构造方法,不区分修饰符
        constructor = c.getDeclaredConstructor();
        System.out.println(constructor);
        constructor = c.getDeclaredConstructor(String.class);
        System.out.println(constructor);
        constructor = c.getDeclaredConstructor(String.class,String.class);
        System.out.println(constructor);

        System.out.println("******************************");
        // 使用构造器对象提供的方法
        User user = (User) constructor.newInstance("admin","123456");
        System.out.println(user);
        constructor = c.getDeclaredConstructor(String.class);
        // 此时的构造方法不能被private修饰
        // 可以通过破坏封装原则的方式,使得可以访问private修饰的构造方法
        constructor.setAccessible(true);
        user = (User) constructor.newInstance("admin");
        System.out.println(user);
    }

}
